/*
 * Copyright (c) 2024 endless-sky
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#pragma once

#include <string>
#include <vector>
#include <memory>
#include <nlohmann/json.hpp>
#include "utils_log.h"

namespace El {
namespace Common {

struct UserInfo {
    std::string username;
    std::string password;  // 明文密码
    std::string role;      // administrator, operator, viewer
    int64_t lastLoginTime; // 最后登录时间
    bool enabled;          // 是否启用
};

class UserManager {
public:
    static UserManager &GetInstance();

    // 初始化用户管理，创建默认管理员账户
    bool Init();

    // 用户登录
    // @param username 用户名
    // @param password 明文密码
    // @return 是否登录成功
    bool Login(const std::string &username, const std::string &password);

    // 添加用户
    // @param user 用户信息
    // @return 是否添加成功
    bool AddUser(const UserInfo &user);

    // 删除用户
    // @param username 用户名
    // @return 是否删除成功
    bool DeleteUser(const std::string &username);

    // 修改用户信息
    // @param user 用户信息
    // @return 是否修改成功
    bool UpdateUser(const UserInfo &user);

    // 获取用户信息
    // @param username 用户名
    // @param user 用户信息
    // @return 是否获取成功
    bool GetUserInfo(const std::string &username, UserInfo &user);

    // 获取所有用户列表
    // @param users 用户列表
    // @return 是否获取成功
    bool GetUserList(std::vector<UserInfo> &users);

    // 修改密码
    // @param username 用户名
    // @param oldPassword 旧密码
    // @param newPassword 新密码
    // @return 是否修改成功
    bool ChangePassword(const std::string &username, const std::string &oldPassword, const std::string &newPassword);

    // 重置密码
    // @param username 用户名
    // @return 是否重置成功
    bool ResetPassword(const std::string &username);

private:
    UserManager() = default;
    ~UserManager() = default;
    UserManager(const UserManager &) = delete;
    UserManager &operator=(const UserManager &) = delete;

    // 保存用户配置到文件
    bool SaveConfig();

    // 从文件加载用户配置
    bool LoadConfig();

    // 加密密码
    std::string EncryptPassword(const std::string &password);

    // 解密密码
    std::string DecryptPassword(const std::string &encryptedPassword);

    // 验证密码
    bool ValidatePassword(const std::string &password, const std::string &encryptedPassword);

    // 生成随机IV
    std::string GenerateIV();

    // 获取加密密钥
    const unsigned char *GetEncryptionKey();

private:
    std::vector<UserInfo> users_;
    static constexpr char DEFAULT_ADMIN_USERNAME[] = "admin";
    static constexpr char DEFAULT_ADMIN_PASSWORD[] = "admin123";

    // 32字节的AES-256密钥
    static constexpr unsigned char ENCRYPTION_KEY[32] = {
        0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c,
        0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c};
};

} // namespace Common
} // namespace El